package org.easy.tool.common;


import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.multipdf.PDFMergerUtility;

import java.io.*;
import java.util.List;

/**
 * @author Valley
 * Created by Valley on 2023/9/7 15:04
 */
public class PdfUtil {

    /**
     * 功能：使用iText完成pdf添加图片
     */
    public static void addPdfImage(String originPDF, String imagePath, String outPDF) throws Exception{
        //pdf文件存放在E盘
        File file = new File(originPDF);
        //合成后的文件
        FileOutputStream outputStream = new FileOutputStream(outPDF);
        PdfReader reader = new PdfReader(new FileInputStream(file));
        PdfStamper stamper = new PdfStamper(reader, outputStream);
        //将签名图片放在pdf文件的第4页
        PdfContentByte over = stamper.getOverContent(1);
        //签名图片
        Image contractSealImg = Image.getInstance(imagePath);
        over.saveState();
        PdfGState pdfGState = new PdfGState();
        pdfGState.setFillOpacity(0.8F);  //给图片设置透明度
        over.setGState(pdfGState);
        contractSealImg.setAbsolutePosition(320, 320);  //设置图片位置
        contractSealImg.scaleAbsolute(80, 60);  //设置图片大小
        over.addImage(contractSealImg);  //将图片添加到pdf文件
        over.restoreState();
        stamper.setFormFlattening(true);
        stamper.close();
        reader.close();
        outputStream.close();
    }

    /**
     * 功能：使用iText完成pdf添加图片
     */
//    public static void addPDFPicture(String inputFile, String outFile, String imageFile) throws Exception{
//        // 创建 PdfDocument 对象
//        PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output.pdf"));
//        Document doc = new Document(pdfDoc);
//        // 加载图片并创建 ImageData 对象
//        ImageData imgData = ImageDataFactory.create(imageFile);
//        Image image = new Image(imgData);
//        image.setOpacity(0.2f); // 设置透明度为 10%
//        // 设置图片位置和大小
//        image.setWidth(new UnitValue(100, UnitValue.PERCENT));
//        image.setHeight(new UnitValue(100, UnitValue.PERCENT));
//        // 将 ImageElement 添加到 Document 中
//        doc.add(image);
//        // 关闭 Document 和 PdfDocument
//        doc.close();
//        pdfDoc.close();
//    }

//    /**
//     * 功能：将本地图片转换为PDF
//     */
//    public static void img2Pdf(String imgDir, String pdfPath) throws Exception {
//        List<String> imgList = FileIOUtil.dirStr(imgDir);
//        // 创建一个Document对象，这里可以使用Rectangle设置宽度
//        Rectangle rectangle = new Rectangle(PageSize.A4);
//        Document document = new Document(rectangle);
//
//        // 创建一个PdfWriter对象，并指定输出PDF文件的路径
//        PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(pdfPath)));
//        // 打开Document对象
//        document.open();
//        for (String s : imgList) {  //循环图片List，将图片加入到pdf中
//            document.newPage();  //在pdf创建一页
//            Image img = Image.getInstance(s); //通过文件路径获取image
//            // 获取PDF页面的尺寸
//            Rectangle pageSize = document.getPageSize();
//            // 使图片宽度匹配PDF页面宽度
//            img.scaleAbsolute(pageSize);
//            // 定位放置pdf开始位置
//            img.setAbsolutePosition(0, 0);
//            document.add(img);
//        }
//        document.close();
//    }
//
//    /**
//     * 功能：PDF文件设置只读属性，使用密钥
//     */
//    public static void readOnlyEncrypt(String originFile, String destFile) throws Exception {
//        String password = RandomUtil.randomStr(10);
//        readOnly(originFile, destFile, password);
//    }
//
//    /**
//     * 功能：PDF文件设置只读属性，密钥自定义
//     */
//    public static void readOnly(String originFile, String destFile, String password) throws Exception {
//        PdfReader reader = new PdfReader(originFile);
//        byte[] ownerPassword = password.getBytes();
//        PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(new File(destFile).toPath()));
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_ASSEMBLY, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_COPY, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_DEGRADED_PRINTING, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_FILL_IN, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_MODIFY_ANNOTATIONS, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_MODIFY_CONTENTS, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_PRINTING, false);
//        stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_SCREENREADERS, false);
//        stamper.close();
//    }

    /**
     * 功能：将pdf转化为本地图片，100页以内的pdf
     */
//    public static List<String> pdf2Img(String pdfPath) throws Exception {
//        return pdf2Img(pdfPath, 100);
//    }

    /**
     * 功能：pdf转图片并返回图片路径
     *
     * @param pdfPath pdf路径
     * @param page    转前几页的图片
     */
//    public static List<String> pdf2Img(String pdfPath, int page) throws Exception {
//        List<String> list = new ArrayList<>();
//        String fileDirectory = pdfPath.substring(0, pdfPath.lastIndexOf("."));//获取去除后缀的文件路径
//        String imagePath;
//        PDDocument doc = PDDocument.load(new File(pdfPath));
//        File f = new File(fileDirectory);
//        if (!f.exists()) {
//            boolean mkdir = f.mkdir();
//        }
//        PDFRenderer renderer = new PDFRenderer(doc);
//        int pageCount = doc.getNumberOfPages();
//        if (pageCount > page) {
//            pageCount = page;
//        }
//        for (int i = 0; i < pageCount; i++) {
//            BufferedImage image = renderer.renderImageWithDPI(i, 100); //第二个参数越大生成图片分辨率越高，转换时间也就越长
//            imagePath = fileDirectory + File.separator + i + ".png";
//            ImageIO.write(image, "PNG", new File(imagePath));
//            list.add(imagePath);
//        }
//        doc.close();
//        return list;
//    }

//    /**
//     * 功能：PDF文件设置只读属性，使用itext5 pdf
//     */
//    public static void readOnlyItext(String origin, String dest) throws Exception {
//        PdfReader reader = new PdfReader(origin);
//        PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(new File(dest).toPath()));
//        stamper.setEncryption(null, null,
//                PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
//        stamper.close();
//    }

//    /**
//     * 功能：PDF文件设置只读属性，使用spire
//     */
//    public static void readOnlySpire(String inputFile, String outputFile) {
//        // 加载要设置为只读的 PDF 文件
//        PdfDocument document = new PdfDocument();
//        document.loadFromFile(inputFile);
//
//        // 获取 PDF 文件中的表单对象
//        PdfForm form = document.getForm();
//
//        // 将表单对象的只读属性设置为 true
//        form.setReadOnly(true);
//        EnumSet<PdfPermissionsFlags> set = EnumSet.of(PdfPermissionsFlags.Print);
//        document.getSecurity().setPermissions(set);
//
//        // 保存修改后的 PDF 文件
//        document.saveToFile(outputFile);
//    }
//
//    /**
//     * 功能：PDF设置背景图片
//     */
//    public static void addBackground(String inputFile, String imgPath, String outputFile) {
//        //加载PDF文档
//        com.spire.pdf.PdfDocument doc = new PdfDocument();
//        doc.loadFromFile(inputFile);
//
//        PdfPageBase page;
//        int pageCount = doc.getPages().getCount();
//
//        //设置背景图片
//        for (int i = 0; i < pageCount; i++) {
//            page = doc.getPages().get(i);
//            page.setBackgroundImage(imgPath);
//        }
//        //保存
//        doc.saveToFile(outputFile);
//    }

    /**
     * 功能：POI实现pdf文件合并
     */
    public static void mergePDF(List<String> originPathList, String outPath) throws Exception {
        PDFMergerUtility mergePDF = new PDFMergerUtility();
        for (String originPath : originPathList) {
            File file = new File(originPath);
            if (file.exists() && file.isFile()) {
                // 循环添加要合并的pdf
                mergePDF.addSource(file);
            }
        }
        // 设置合并生成pdf文件名称
        mergePDF.setDestinationFileName(outPath);
        // 合并pdf
        mergePDF.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
    }

//    /**
//     * 功能：使用itext7对pdf设置背景图片
//     */
//    public static void addPDFPicture(String originPDF, String imageFile, String outPDF) throws Exception{
//
//
//        byte[] result = null;
//        // 获取pdf地址
//        String path = originPDF;
//        // 获取背景图 pdf
//        String bgPath = imageFile;
//        // 获取pdf输入流
//        InputStream fis = new BufferedInputStream(new FileInputStream(path));
//        // 建立pdf输出流
//        ByteArrayOutputStream baos = new ByteArrayOutputStream();
//        // 获取pdf
//        PdfDocument pdfDoc = new PdfDocument(new PdfReader(fis)); // 待增加背景的pdf
//        PdfDocument pdfOutDoc = new PdfDocument(new PdfWriter(baos)); // 增加后的pdf 进行输出
//        // 获取背景
//        PdfDocument bgDoc = new PdfDocument(new PdfReader(bgPath));
//        PdfPage bgPage = bgDoc.getFirstPage();
//        // 获取背景大小
//        PageSize pageSize = pdfDoc.getDefaultPageSize();
//
//        for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
//            PdfPage pageIn = pdfDoc.getPage(i);
//
//            // 创建一个新的 PDF 页面，并获取其画布
//            PdfPage pageOut = pdfOutDoc.addNewPage(pageSize);
//            PdfCanvas canvas = new PdfCanvas(pageOut);
//
//            // 将背景图像绘制到新建的页面模板中
//            canvas.addXObject(bgPage.copyAsFormXObject(pdfOutDoc), 0, 0);
//            // 将原有 PDF 页面绘制到新的 PDF 页面上
//            PdfFormXObject formXObject = pageIn.copyAsFormXObject(pdfOutDoc);
//            canvas.addXObject(formXObject, 0, 0);
//
//        }
//        // 关闭输入和输出 PDF 文件
//        pdfDoc.close();
//        pdfOutDoc.close();
//        bgDoc.close();
//
//        //输出流输出并关闭
//        baos.writeTo(Files.newOutputStream(Paths.get(outPDF)));
//        baos.close();
//    }


}
